今天來介紹 SwiftUI 基本的專案結構,如果寫過 iOS 的夥伴看到這篇應該是熟悉到不行,那麼此篇可以先跳過,不過因為我是從零學起,所以每個專案細節都不想放過,那麼沒問題的話,就開始介紹囉!
LearnHappyLeetCodeApp.swift
這是我們 SwiftUI App 的程式碼入口,也就是啟動 App時候會第一個執行的地方,如果有新建什麼東西是要在 App 活著的整個週期都要存在,可以放在這裡。ContentView.swift
是我們初始化 UI 使用者介面的地方,也是我們所有在專案要做的事情都會建立在這個檔案上,這邊都只能放 SwiftUI 的東西。Assets.xcassets
專門放一些 App 資源檔,也就是如果我們有一些圖片會放在這裡,或是顏色設定,更或是 App 的 Icon,都集中在這邊。Persistence
跟 LearnHappyLeetCode
它是 Core data ,專門設計用來存放資料於本機,背後操作仍是 SQLite,只是被簡化後的版本,讓不懂 SQL 指令的人也可以輕鬆使用。Preview Content
是一個集合,它是方便我們用來測試時放的檔案夾,不僅可以放圖片檔,甚至模擬 API 回覆所製作的 JSON 檔,還有影片聲音都可以放在這裡提供測試預覽時使用。LearnHappyLeetCodeTests
這資料夾就是拿來放單元測試的地方,利用單元測試方便我們測試寫出來的程式邏輯,使程式更加穩固。LearnHappyLeetCodeUITest
這資料夾是用來寫 UI 測試的地方,執行的時候會真正啟動畫面去測試。import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
ContentView.swift 這個檔案裏面的 ContentView 令人比較意外的是宣告為 struct,且他是繼承 view 也就是說他遵循 view 的 protocol,注意不是繼承以往的 UIView,用意是希望預設 View 就是不可輕易變動 (英文叫做 Immutable),而內含的 body 語法比較特別,居然是 var body: some View
,去查了一下資料,叫做 opaque return types,也就是說會遵循 View protocol,但我們實作時不需要知道 View 裡面的具體運作,只有編譯器會知道,也就是說,它允許開發者返回一個特定的類型,但並不需要在定義時指定確切的類型。這為 SwiftUI 提供了極大的靈活性,使得我們可以在不犧牲類型安全性的前提下,進行快速的界面開發。
總之,var body: some View
的作用是定義一個返回 View 的計算屬性,並且具體的 View 類型可以在後面的代碼中進行推斷。
Text("Hello, World!")
則是我們建立的文字 View,並且提供給 body 告訴它畫面需要顯示文字,文字內容顯示 Hello, World!
。
而 ContentView_Previews 無疑就是專門寫預覽用的測試畫面,為了搶先預覽,可以藉由預覽這個 struct 放入不同參數給 ContentView,這一點跟 Jetpack Compose 的設計有異曲同工之妙。
比起過往開發 iOS 的專案結構,SwiftUI 專案結構無疑簡化了很多資訊,這或許就是 Apple 未來要的精神,讓開發者可以很簡單就產出想要的 App,今天介紹就到這裡囉!
感謝以下參考資訊,很多不懂的知識都感謝撰文者詳細說明,有興趣的讀者可以去詳細延伸閱讀。